package com.sise.Linked;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

/**
 *      剑指 Offer 06. 从尾到头打印链表
 *      输入一个链表的头节点，从尾到头反过来返回每个节点的值（用数组返回）。
 *
 *      示例 1：
 *      输入：head = [1,3,2]
 *      输出：[2,3,1]
 */
public class _offer_06_reversePrint {

    /**
     *      解法一：利用递归函数到最后一个数值，将其加入到 List 中，然后上一层递归(类似于栈)，
     *      将所有到数值加入，最后返回主体再将其拼接输出
     */
    List<Integer> list = new ArrayList<>();
    public int[] reversePrint(ListNode head) {
        recur(head);
        int[] res = new int[list.size()];
        for (int i = 0; i < list.size(); i++){
            res[i] = list.get(i);
        }
        return res;
    }

    private void recur(ListNode head){
        if (head == null) return;
        recur(head.next);
        list.add(head.val);
    }

    /**
     *      解法二：利用栈先进后出的特征
     */
    public int[] reversePrint_2(ListNode head) {
        LinkedList<Integer> stack = new LinkedList<>();
        while (head != null){
            stack.addLast(head.val);                    // 加在尾部
            head = head.next;
        }

        int[] res = new int[stack.size()];
        for(int i = 0; i < res.length; i++){
            res[i] = stack.removeLast();                // 移除尾部
        }
        return res;
    }
}
